package main

import "fmt"

type FuncType func(int, int) int // 声明了一个函数类型 注意 func后面没有函数名

func Clac(a int, b int, f FuncType) (result int) {
	result = f(a, b)
	return result
}

func Add(a int, b int) (result int) {
	result = a + b
	return result
}

//func main() {
	// res := Clac(10 , 8 , Add)
	// fmt.Println(res)

	// 这两个参数会被我们下面的匿名函数捕获
	//var a int = 10
	// var str string = "abcde"

	// 方式一 使用：= 来让一个变量接收func类型
	//f1 := func() { // 这里的func()是一个匿名函数 无参数无返回值
	//	fmt.Println(a, "  ", str)
	// }

	// f1()

	// 方式二 在你们函数的末尾直接调用
	// func(a int , b int)(result int){
		//result = a + b
		// fmt.Println(result)
		// return result
	// }(1 , 1)

	// fmt.Println("程序成功运行")
//}

// func main()  {
// 	var a int = 10 
// 	var str string = "abcde"

// 	f1 := func(){
// 		a = 20
// 		str = "go"
// 	}

// 	f1()

// 	// 此时打印a 和 str 我们会发现它们的值改变了 
// 	fmt.Println(a , str)	
// }

func squares() (func() int) {
	var x int 

	return func() (ans int){
		x++
		return x * x
	}
}

func main()  {
	f := squares()

	fmt.Println(f())
	fmt.Println(f())
	fmt.Println(f())
	fmt.Println(f())
}